home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / telecomm / archivers / vec_3.231.lha / vec3231 / source / amiga / amiga.c next >
Encoding:
C/C++ Source or Header  |  1993-12-06  |  2.9 KB  |  178 lines

  1. /*
  2.  * AMIGA.C (VEC)
  3.  *
  4.  * Copyright (c) 1993 Ville Saari
  5.  * All rights reserved
  6.  *
  7.  * Created: 07-Apr-93
  8.  * Updated: 04-Dec-93
  9.  */
  10.  
  11. #include <proto/dos.h>
  12. #include <proto/exec.h>
  13. #include <exec/memory.h>
  14. #include <signal.h>
  15. #include <string.h>
  16.  
  17. static struct AnchorPath *ap;
  18. static int matching, os204;
  19. static BPTR stderr, origcd;
  20.  
  21. BPTR openappend(const char *name, int binary)
  22.     {
  23.     BPTR fh;
  24.  
  25.     if(!(fh=Open((char *)name, MODE_READWRITE))) return 0;
  26.  
  27.     Seek(fh, 0, OFFSET_END);
  28.  
  29.     if(IoErr())
  30.         {
  31.         Close(fh);
  32.         return 0;
  33.         }
  34.  
  35.     return fh;
  36.     }
  37.  
  38. void getfilemode(const char *name, unsigned char *flagbuf, int uu)
  39.     {
  40.     char fibbuf[sizeof(struct FileInfoBlock)+2];
  41.     BPTR lock;
  42.     struct FileInfoBlock *fib;
  43.  
  44.     fib=(struct FileInfoBlock *)(((long)fibbuf+2)&0xfffffffc);
  45.  
  46.     if(lock=Lock((char *)name, ACCESS_READ))
  47.         {
  48.         if(Examine(lock, fib))
  49.             if(uu)
  50.                 flagbuf[0]=((fib->fib_Protection>>1)&7^7)+'0';
  51.             else
  52.                 {
  53.                 flagbuf[2]|=1;
  54.                 flagbuf[5]=fib->fib_Protection;
  55.                 }
  56.  
  57.         UnLock(lock);
  58.         }
  59.     }
  60.  
  61. void setfilemode(const char *name, const unsigned char *flags)
  62.     {
  63.     int mode;
  64.  
  65.     switch(flags[2]&0x0f)
  66.         {
  67.         case 1: /* Amiga flags */
  68.             mode=flags[5];
  69.             break;
  70.  
  71.         case 2: /* Unix flags */
  72.             mode=(flags[4]&1)<<3;         /* Owner read    -> ----r--- */
  73.             if(flags[5]&0x80) mode|=0x05; /* Owner write   -> -----w-d */
  74.             if(flags[5]&0x40) mode|=0x40; /* Owner execute -> -s------ */
  75.             mode^=0x0f;
  76.             break;
  77.  
  78.         default:
  79.             mode=0x02; /* ----rw-d */
  80.         }
  81.  
  82.     if(mode) SetProtection((char *)name, mode);
  83.     }
  84.  
  85. char *basename(const char *name)
  86.     {
  87.     const char *basename;
  88.  
  89.     for(basename=name; *name; name++)
  90.         if(*name==':' || *name=='/') basename=name+1;
  91.  
  92.     return basename;
  93.     }
  94.  
  95. void init(void)
  96.     {
  97.     signal(SIGINT, SIG_IGN);
  98.  
  99.     if((os204=(DOSBase->dl_lib.lib_Version>=37)) &&
  100.         (ap=(struct AnchorPath *)AllocMem(sizeof *ap+255, MEMF_CLEAR)))
  101.         ap->ap_Strlen=256;
  102.     }
  103.  
  104. char *firstmatch(const char *pattern)
  105.     {
  106.     int l=strlen(pattern);
  107.  
  108.     if(!ap || l && pattern[l-1]==':') return pattern;
  109.  
  110.     if(DOSBase->dl_Root->rn_Flags&RNF_WILDSTAR && l==1 && *pattern=='*')
  111.         pattern="#?";
  112.  
  113.     if(MatchFirst((char *)pattern, ap))
  114.         {
  115.         MatchEnd(ap);
  116.         return 0;
  117.         }
  118.  
  119.     matching=1;
  120.  
  121.     return (char *)ap->ap_Buf;
  122.     }
  123.  
  124. char *nextmatch(void)
  125.     {
  126.     if(!ap) return 0;
  127.  
  128.     if(MatchNext(ap))
  129.         {
  130.         matching=0;
  131.         MatchEnd(ap);
  132.         return 0;
  133.         }
  134.  
  135.     return (char *)ap->ap_Buf;
  136.     }
  137.  
  138. void cleanup(void)
  139.     {
  140.     if(origcd) UnLock(CurrentDir(origcd));
  141.     if(matching) MatchEnd(ap);
  142.     if(ap) FreeMem(ap, sizeof *ap+255);
  143.     if(stderr && stderr!=(BPTR)-1) Close(stderr);
  144.     }
  145.  
  146. static BPTR stderr=0;
  147.  
  148. void printerr(const char *string)
  149.     {
  150.     if(!stderr)
  151.         if(!(stderr=Open(os204?"CONSOLE:":"*", MODE_NEWFILE)))
  152.             stderr=(BPTR)-1;
  153.  
  154.     if(stderr!=(BPTR)-1)
  155.         Write(stderr, (void *)string, strlen(string));
  156.     }
  157.  
  158. int changedir(const char *path)
  159.     {
  160.     BPTR lock, old;
  161.  
  162.     if(!(lock=Lock((char *)path, ACCESS_READ)))
  163.         return 0;
  164.  
  165.     if(!(old=CurrentDir(lock)))
  166.         {
  167.         UnLock(lock);
  168.         return 0;
  169.         }
  170.  
  171.     if(origcd)
  172.         UnLock(old);
  173.     else
  174.         origcd=old;
  175.  
  176.     return 1;
  177.     }
  178.